"use strict";

/**
 * @fileoverview search 插件
 */
function search(vm) {
  /**
   * @description 关键词搜索
   * @param {regexp|string} key 要搜索的关键词
   * @param {boolean} anchor 是否将搜索结果设置为锚点
   * @param {string} style 搜索结果的样式
   */
  vm.search = function (key, anchor) {
    var style = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'background-color:yellow';
    var res = [],
        stack = []; // 遍历搜索

    (function traversal(nodes) {
      for (var i = 0; i < nodes.length; i++) {
        var node = nodes[i];

        if (node.type == 'text' && key) {
          var text = node.text,
              arr = text.split(key);

          if (arr.length > 1) {
            node = {
              name: 'span',
              attrs: {},
              type: 'node',
              c: anchor ? 1 : void 0,
              s: 1,
              children: []
            };
            vm.$set(nodes, i, node);

            for (var j = 0; j < arr.length; j++) {
              if (arr[j]) node.children.push({
                type: 'text',
                text: arr[j]
              });

              if (j != arr.length - 1) {
                // 关键词转为一个 span
                node.children.push({
                  name: 'span',
                  attrs: {
                    id: anchor ? 'search' + (res.length + 1) : void 0,
                    // 用于锚点的 id
                    style: style
                  },
                  children: [{
                    type: 'text',
                    text: key instanceof RegExp ? key.exec(text)[0] : key
                  }]
                });
                res.push(node.children[node.children.length - 1].attrs);
              }
            }

            if (key instanceof RegExp) key.exec(text);

            if (anchor) {
              for (var l = stack.length; l--;) {
                if (stack[l].c) break;else vm.$set(stack[l], 'c', 1);
              }
            }
          }
        } else if (node.s) {
          var _text = ''; // 复原上一次的结果

          for (var k = 0; k < node.children.length; k++) {
            var child = node.children[k];
            if (child.text) _text += child.text;else _text += child.children[0].text;
          }

          vm.$set(nodes, i, {
            type: 'text',
            text: _text
          });
          if (key && (key instanceof RegExp ? key.test(_text) : _text.includes(key))) i--;
        } else if (node.children) {
          stack.push(node);
          traversal(node.children);
          stack.pop();
        }
      }
    })(vm.nodes);

    return new Promise(function (reslove) {
      setTimeout(function () {
        reslove({
          num: res.length,
          // 结果数量

          /**
           * @description 高亮某一个结果
           * @param {number} i 第几个
           * @param {string} hlstyle 高亮的样式
           */
          highlight: function highlight(i) {
            var hlstyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'background-color:#FF9632';
            if (i < 1 || i > res.length) return;
            if (this.last) res[this.last - 1].style = style;
            this.last = i;
            res[i - 1].style = hlstyle;
          },

          /**
           * @description 跳转到搜索结果
           * @param {number} i 第几个
           * @param {number} offset 偏移量
           */
          jump: anchor ? function (i, offset) {
            if (i > 0 && i <= res.length) vm.navigateTo('search' + i, offset);
          } : void 0
        });
      }, 200);
    });
  };
}

module.exports = search;